package com.example.demo.service.lmp;


import com.example.demo.Request.OrderModificationRequest;
import com.example.demo.mapper.OrderMapper;
import com.example.demo.model.Item;
import com.example.demo.model.ItemType;
import com.example.demo.model.Order;
import com.example.demo.model.OrderStatus;
import com.example.demo.service.IOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.*;

/*
 *订单的服务层核心业务逻辑
 */
@Service
public class OrderServicelmp implements IOrderService {
    @Autowired
    OrderMapper orderMapper;
    // 模拟数据库存储，使用HashMap来存储订单
    private Map<String, Order> orderMap = new HashMap<>();

    @Override
    public Order createOrder(List<Item> items, boolean isVIP) {
        //跟踪订单是否包含主食itemType.MAIN和甜品itemType.DESSERT
       boolean hhh= false;
       boolean ddd = false;
       //循环遍历items列表中每个item对象，判断列表
       for(Item item: items){
           //判断items是否为null，是否初始化 and 是否为空集合
           if(items ==null || items.isEmpty() ){
               throw new BusinessException("订单必须包含至少一个商品");
           }
           //订单商品最多包含5个
           if(items.size() >5){
               throw new BusinessException("订单商品最多包含五个商品");
           }
           //判断列表是否有主食有则hhh=true;
         if(item.getType()== ItemType.MAIN){
             hhh=true;
         }
           //订单没有主食（hhh=false）
           if(!hhh){
               throw new IllegalArgumentException("每个订单必须包含至少一个主食");
           }
         //判断列表是否有甜品
         if(item.getType() == ItemType.DESSERT){
             ddd=true;
         }
           //订单中有甜品但没有主食
           if(ddd && !hhh){
               throw new IllegalArgumentException("甜品不能单独购买，必须搭配主食");
           }
       }
       /*
       *促销规则
        */
      //初始化存储订单总价
      double  totalprice=0.0;
      //初始化存储订单总价和记录每种饮料的数量
        Map<String,Integer> drinkCounts =new HashMap<>();
        int hamburger =0;
        int crisps =0;

      //第二杯半价，价格计算
      //遍历订单中每个商品项item
      for(Item item:items){
          if(item.getType() == ItemType.DRINK){//是否饮料类型
              //更新饮料数量getOrDefaul获得当前饮料的计数
              drinkCounts.put(item.getId(),drinkCounts.getOrDefault(item.getId(),0)+1);
              int count =drinkCounts.get(item.getId());//获得当前订单中饮料的数量
              if(count ==2){//是否第二杯
                  totalprice +=item.getPrice()/2;//第二杯半价，将当前饮料的价格的一半加totalprice
              }else {
                  totalprice +=item.getPrice();//当前饮料的全价加到totalPrice
              }
          }else {
              //如果当前商品不是饮料（即主食或甜品），则直接将商品的全价加到totalPrice上
              totalprice+=item.getPrice();
          }
          if("汉堡".equals(item.getName())){
              hamburger++;//计数器+1
          }
          if("薯片".equals(item.getName())){
              crisps++;
          }

      }


      /*
      　 ＊组合薯片＋汉堡＝２５（原价３０）--优惠五元
        *总金额-Math.min(hamburger,crisps)最小值
        * 只有当汉堡和薯条都至少有一个时，才能应用套餐优惠
       *Math.min(hamburger,crisps)数量最小值，计算算订单套餐优惠数量
                   1         1    =1      优惠 1*5
                   2         1    =1      优惠 1*5
                   2         2    = 2     优惠 2*5
        * VIP折扣
        * 判断是否为VIP
       */
        int comboDiscountCount = Math.min(hamburger, crisps);
        totalprice -=comboDiscountCount *5;
        if(isVIP){
            totalprice *=0.9;//九折优惠
        }


        //创建初始化订单对象的过程
        Order order =new Order();
        //UUID.randomUUID()方法生成全局唯一标识UUID
        //.toString()转换为字符串--setOrderId设置订单的唯一标识符
        order.setOrderId(UUID.randomUUID().toString());//保证订单的唯一
        order.setItems(items);//购买的商品
        order.setStatus(OrderStatus.CREATE);
        order.setCreateTime(LocalDateTime.now());//获得当前日期和时间
        //移除冰咖啡
        Iterator<Item> iterator = items.iterator();
        //iterator迭代器
        while (iterator.hasNext()) {
            Item item = iterator.next();
            //判断是否饮料 && 是否包含“冰咖啡”  && getHour提取小时数 >15
            if (item.getType() == ItemType.DESSERT && item.getName().contains("冰咖啡") && LocalDateTime.now().getHour() > 15) {
                iterator.remove(); // 移除冰咖啡
                totalprice-=15;
                order.addRemark("冰咖啡已下架，三点后不售卖"); // 添加备注
              //  throw  new BusinessException("冰咖啡在下午三点后不售卖了");
            }
        }
        order.setTotalPrice(totalprice);
        // 将订单添加到模拟数据库中
        orderMap.put(order.getOrderId(), order);
        return order;

    }

    /*
    *取消订单
     */
    @Override
    public String cancelOrder(String orderId) {
        //获得订单列表
        Order order= orderMap.get(orderId);
       if(order==null){
           throw new BusinessException("订单不存在,请下单");
       }
       if(order.getStatus()==OrderStatus.PAID){
           throw new BusinessException("该订单已经支付,不能够取消,请告知我们取消！！");
       }
       //时间的对比，计算订单的创建时间与当前时间的差值
        //order.getCreateTime()创建时间
        Duration duration = Duration.between(order.getCreateTime(),LocalDateTime.now());
        // 检查订单是否超过30分钟
        if (duration.toMinutes() > 30) { // 时间差duration转换为分钟
            // 订单自动取消，修改订单状态已创建==>已取消
            order.setStatus(OrderStatus.CANCELLER); // 注意：这里应该是 CANCELLED，而不是 CANCELLER
        } else {
            // 如果订单未超过30分钟，则可以取消订单
            order.setStatus(OrderStatus.CANCELLER);
        }
        // 将更新后的订单对象重新存入 orderMap 中
        orderMap.put(orderId, order);
        return orderId;
    }
    public static class BusinessException extends RuntimeException {
        public BusinessException(String message) {
            //调用父类 RuntimeException 的构造方法，将异常描述信息传递给父类。
            super(message);
        }
    }
    //查看订单详情
    @Override
    public Order getOrderDetails(String orderId) {
        return orderMap.get(orderId);
    }




}
